//package com.empire.module.member.service.datahub;
//
//import com.alibaba.fastjson.JSONObject;
//import com.empire.module.member.controller.admin.warninggather.vo.ActiveGather;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.kafka.core.KafkaTemplate;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import java.time.LocalDateTime;
//import java.time.format.DateTimeFormatter;
//import java.util.*;
//import java.util.concurrent.ExecutionException;
//
///**
// * DataHub数据发送模拟器（复用Kafka发送逻辑改造）
// */
//@Slf4j
//@Component
//public class DataHubSender {
//    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//    private static final Random RANDOM = new Random();
//
//    // Kafka主题（与接收端保持一致）
//    private static final String TOPIC = "datahub-location-topic";
//
//    @Resource
//    private KafkaTemplate<Object, Object> kafkaTemplate;  // 复用KafkaTemplate注入方式
//
//    /**
//     * 定时发送模拟数据（每5秒发送一条）
//     */
//    @Scheduled(fixedRate = 5000)
//    public void sendMockData()  {
//        // 生成模拟数据
//        ActiveGather.DataHubLocationVO data = generateMockData();
//
//        // 发送到Kafka（复用消息发送逻辑）
//        sendKafkaMessage(data);
//    }
//
//    /**
//     * 封装Kafka消息发送逻辑（借鉴原有KafkaWebSocketMessageSender）
//     */
//    private void sendKafkaMessage(ActiveGather.DataHubLocationVO data) {
//        try {
//            // 发送消息并同步等待结果（确保消息发送状态可追踪）
//            kafkaTemplate.send(TOPIC, JSONObject.toJSONString(data)).get();
//            log.info("发送数据成功: {}", data.getIdNumber());
//        } catch (InterruptedException | ExecutionException e) {
//            log.error("[sendKafkaMessage][发送数据({})到Kafka失败]", data, e);
//        }
//    }
//
//    // 以下为原有数据生成逻辑（保持不变）
//    private static final List<String> ID_CARD_NUMBERS = Arrays.asList(
//            "440105200910200124",
//            "510101201011211236",
//            "510102201112222347",
//            "500101201201233458",
//            "500102201302244569",
//            "330101201403255670",
//            "330102201504266781",
//            "320101201605277892",
//            "320102201706288903",
//            "120101201807299014",
//            "435231199009123432",
//            "330111199809123425",
//            "330111189709123432"
//    );
//
//    private static final List<String> PASSPORT_NUMBERS = Arrays.asList(
//            "E12345678", "P98765432", "A13579246", "B24681357", "C35792468",
//            "D46813579", "E57924681", "F68135792", "G79246813", "H81357924",
//            "J92468135", "K14725836", "L25836947", "M36947158", "N47158269",
//            "O58269370", "P69370481", "Q70481592", "R81592603", "C26037148", "C38947148"
//    );
//
//    private static final Map<String, double[]> HANGZHOU_AREAS = new HashMap<String, double[]>() {{
//        put("330102", new double[]{120.16707, 30.25708});  // 上城区
//        put("330103", new double[]{120.14507, 30.27408});  // 下城区
//        put("330104", new double[]{120.18207, 30.26408});  // 江干区
//        put("330105", new double[]{120.13207, 30.28408});  // 拱墅区
//        put("330106", new double[]{120.10507, 30.25408});  // 西湖区
//        put("330108", new double[]{120.19507, 30.21408});  // 滨江区
//        put("330109", new double[]{120.27507, 30.17408});  // 萧山区
//        put("330110", new double[]{120.09507, 30.31408});  // 余杭区
//        put("330111", new double[]{119.95507, 30.07408});  // 富阳区
//        put("330112", new double[]{119.72507, 30.23408});  // 临安区
//        put("330122", new double[]{119.64507, 29.80408});  // 桐庐县
//        put("330127", new double[]{119.05507, 29.61408});  // 淳安县
//        put("330182", new double[]{119.27507, 29.49408});  // 建德市
//    }};
//
//    private static final Map<String, String> AREA_NAMES = new HashMap<String, String>() {{
//        put("330102", "上城区");
//        put("330103", "下城区");
//        put("330104", "江干区");
//        put("330105", "拱墅区");
//        put("330106", "西湖区");
//        put("330108", "滨江区");
//        put("330109", "萧山区");
//        put("330110", "余杭区");
//        put("330111", "富阳区");
//        put("330112", "临安区");
//        put("330122", "桐庐县");
//        put("330127", "淳安县");
//        put("330182", "建德市");
//    }};
//
//    private static final String[] STREET_PREFIXES = {"东", "南", "西", "北", "中", "复兴", "解放", "延安", "西湖", "钱江"};
//    private static final String[] STREET_SUFFIXES = {"路", "街", "巷", "大道", "胡同", "里"};
//    private static final String[] COMMUNITY_NAMES = {"幸福家园", "阳光小区", "和谐公寓", "花园大厦", "湖畔人家", "都市丽景"};
//
//    private ActiveGather.DataHubLocationVO generateMockData() {
//        ActiveGather.DataHubLocationVO data = new ActiveGather.DataHubLocationVO();
//
//        // 随机证件类型（1-身份证，2-护照）
//        int idType = RANDOM.nextBoolean() ? 1 : 2;
//        data.setIdType(idType);
//
//        // 根据证件类型从对应的号码池选择
//        if (idType == 1) {
//            data.setIdNumber(ID_CARD_NUMBERS.get(RANDOM.nextInt(ID_CARD_NUMBERS.size())));
//        } else {
//            data.setIdNumber(PASSPORT_NUMBERS.get(RANDOM.nextInt(PASSPORT_NUMBERS.size())));
//        }
//
//        // 生成时间
//        long minutesOffset = RANDOM.nextInt(100);
//        LocalDateTime locateTime = LocalDateTime.now().minusMinutes(minutesOffset);
//        data.setLocateTime(locateTime.format(DATE_FORMATTER));
//
//        // 生成地理位置
//        List<String> areaCodes = new ArrayList<>(HANGZHOU_AREAS.keySet());
//        String randomAreaCode = areaCodes.get(RANDOM.nextInt(areaCodes.size()));
//        double[] center = HANGZHOU_AREAS.get(randomAreaCode);
//        String areaName = AREA_NAMES.get(randomAreaCode);
//
//        double maxLngOffset = 0.0179;
//        double maxLatOffset = 0.018;
//        double lngOffset = (RANDOM.nextDouble() * 2 - 1) * maxLngOffset;
//        double latOffset = (RANDOM.nextDouble() * 2 - 1) * maxLatOffset;
//
//        data.setLng(center[0] + lngOffset);
//        data.setLat(center[1] + latOffset);
//        data.setAddress(generateRealisticAddress(areaName));
//
//        return data;
//    }
//
//    private String generateRealisticAddress(String areaName) {
//        String street = STREET_PREFIXES[RANDOM.nextInt(STREET_PREFIXES.length)] +
//                STREET_SUFFIXES[RANDOM.nextInt(STREET_SUFFIXES.length)];
//        int doorNumber = 1 + RANDOM.nextInt(200);
//        String community = COMMUNITY_NAMES[RANDOM.nextInt(COMMUNITY_NAMES.length)];
//        int unit = 1 + RANDOM.nextInt(10);
//        int room = 101 + RANDOM.nextInt(900);
//
//        return String.format("%s%s%d号%s%d单元%d室",
//                areaName, street, doorNumber, community, unit, room);
//    }
//
//    private double calculateDistance(double lng1, double lat1, double lng2, double lat2) {
//        final int R = 6371000;
//        double latDistance = Math.toRadians(lat2 - lat1);
//        double lonDistance = Math.toRadians(lng2 - lng1);
//        double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
//                + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
//                * Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
//        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
//        return R * c;
//    }
//}
